`include "../define.svh"

module Mult_top 
(
    input clk,
    input sys_rst_n,
    input en,
    input [1:0] data_type,
    input [`DATA_SIZE-1:0] data_in,
    input [`DATA_SIZE-1:0] weight_in,
    input mix_precision,
    output [`DATA_SIZE-1:0] float_o,
    output reg mult_out_valid
);
    //----------------------------------------------------------
    // 浮点路径信号
    //----------------------------------------------------------
    wire [`DATA_SIZE-1:0] fp_result;    // 浮点结果

    //----------------------------------------------------------
    // 整数路径信号
    //----------------------------------------------------------
    wire [31:0] int_result;         // 整数原始结果
    reg int_valid;                       // 整数有效信号

    //----------------------------------------------------------
    // Valid信号生成逻辑
    //----------------------------------------------------------
    wire is_fp_mode = (data_type[1] == 1'b1);  // 最高位为1 → FP模式
    
    // 有效信号寄存器
    reg fp_valid_reg1;
    always @(posedge clk) begin
            if (is_fp_mode) begin
                fp_valid_reg1 <= en;              // Cycle 1
            end else begin
                fp_valid_reg1 <= 1'b0;
            end
        end


    // 整数Valid信号（1周期延迟）
    always @(posedge clk or negedge sys_rst_n) begin
        if (!sys_rst_n) begin
            int_valid <= 1'b0;
        end 
        else begin
            int_valid <= en;
        end
    end

    // 最终Valid选择
    always @(*) begin
        case (data_type)
            `FP16, `FP32: mult_out_valid = fp_valid_reg1;
            `INT4, `INT8:       mult_out_valid = int_valid;
            default:            mult_out_valid = 1'b0;
        endcase
    end

    //----------------------------------------------------------
    // 模块实例化
    //----------------------------------------------------------
    // 浮点乘法器实例化
    FP_Mult fp_mult_inst (
        .clk(clk),
        .sys_rst_n(sys_rst_n),
        .en(en),
        .data_type(data_type),
        .data_in(data_in),
        .mix_precision(mix_precision),
        .weight_in(weight_in),
        .float_o(fp_result)
    );

    // 整数乘法器实例化（添加时序逻辑）
    int_mult_top int_mult_inst (
        .clk(clk),
        .int_a_in(data_in),
        .int_b_in(weight_in),
        .data_type(data_type),
        .int_out(int_result)
    );

    //----------------------------------------------------------
    // 输出选择器（动态选择）
    assign float_o = ((data_type == `FP16) || (data_type == `FP32)) ? 
                   fp_result : 
                   int_result; 

endmodule